
import java.util.Collections;

import java.util.LinkedList;

import data.Sommet;




public class Permutation {
	int[] sigma;
	static LinkedList<Integer> configref;{
		configref=new LinkedList<Integer>();
		configref.add(0);configref.add(1);configref.add(2);configref.add(3);configref.add(7);configref.add(6);
		configref.add(5);configref.add(4);configref.add(8);configref.add(9);configref.add(10);configref.add(11);
		configref.add(15);configref.add(14);configref.add(13);configref.add(12);
	}



	public Permutation() {
		sigma=new int[16];
		for (int i=0;i<16;i++){
			sigma[i]=i;
		}
	}

	public Permutation(Sommet s){
		int[] m=s.sommet;
		int[] tab=new int[16];
		tab[0]=m[0];tab[1]=m[1];tab[2]=m[2];tab[3]=m[3];tab[4]=m[7];tab[5]=m[6];tab[6]=m[5];
		tab[7]=m[4];tab[8]=m[8];tab[9]=m[9];tab[10]=m[10];tab[11]=m[11];tab[12]=m[15];tab[13]=m[14];
		tab[14]=m[13];tab[15]=m[12];
		sigma=new int[16];
		for (int i=0;i<16;i++){
			int h=tab[i];
			sigma[i]=configref.indexOf(h);
		}
	}

	public int[] deplacezero(){
		int[] tab=new int[15];
		boolean b=false;
		for (int i=0;i<16;i++){
			if (!b){
				if (!(sigma[i]==0)){
					tab[i]=sigma[i];
				}
				else{
					b=true;
				}
				
			}
			else {
				tab[i-1]=sigma[i];
			}
			
		}
		return tab;
	}



	public int signature(){
		int[] m=deplacezero();
		double epsilon=1;
		for (int i=1;i<15;i++){
			for (int r=0;r<i;r++){
				epsilon=epsilon*(m[r]-m[i])/(r-i);
			}
		}
		if (epsilon<0) {return -1;}
		return 1;
	}

	public void melange(){
		LinkedList<Integer> l=new LinkedList<Integer>();
		for (int i=0;i<16;i++){
			l.add(sigma[i]);
		}
		Collections.shuffle(l);
		for (int i=0;i<16;i++){
			sigma[i]=l.poll();
		}
		if (signature()==-1){
			int i=(int)Math.floor(Math.random()*15);
			int j=i;
			while (i==j){
				j=(int)Math.floor(Math.random()*15);
			}
			int f=sigma[i];
			sigma[i]=sigma[j];
			sigma[j]=f;
		}
		
		

	}

	public Sommet creersommet(){
		Sommet s=new Sommet();
		for (int i=0;i<16;i++){
			int j=sigma[i];
			if (j==0){
				s.zero=i;
			}
		}
		s.sommet[0]=configref.get(sigma[0]);s.sommet[1]= configref.get(sigma[1]);s.sommet[2]= configref.get(sigma[2]);
		s.sommet[3]= configref.get(sigma[3]);s.sommet[4]= configref.get(sigma[7]);s.sommet[5]= configref.get(sigma[6]);
		s.sommet[6]= configref.get(sigma[5]);s.sommet[7]= configref.get(sigma[4]);s.sommet[8]= configref.get(sigma[8]);
		s.sommet[9]= configref.get(sigma[9]);s.sommet[10]= configref.get(sigma[10]);s.sommet[11]= configref.get(sigma[11]);
		s.sommet[12]= configref.get(sigma[15]);s.sommet[13]= configref.get(sigma[14]);s.sommet[14]= configref.get(sigma[13]);
		s.sommet[15]= configref.get(sigma[12]);
		return s;
	}

	
}
